package com.example.carbonbackend.service.impl;

import org.springframework.util.FileCopyUtils;
import org.springframework.web.multipart.MultipartFile;

import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;

// 1. 导入必要的类和接口

public class MockMultipartFile implements MultipartFile {
    private final String name;

    private String originalFilename;

    private String contentType;

    private final byte[] content;

    /**
     * 使用给定的内容创建一个新的 MultipartFileDto。
     *
     * @param name    文件的名称
     * @param content 文件的内容
     */
    public MockMultipartFile(String name, byte[] content) {
        this(name, "", null, content);
    }

    /**
     * 使用给定的内容流创建一个新的 MultipartFileDto。
     *
     * @param name          文件的名称
     * @param contentStream 文件内容流
     * @throws IOException 如果从流中读取失败
     */
    public MockMultipartFile(String name, InputStream contentStream) throws IOException {
        this(name, "", null, FileCopyUtils.copyToByteArray(contentStream));
    }

    /**
     * 使用给定的内容创建一个新的 MultipartFileDto。
     *
     * @param name             文件的名称
     * @param originalFilename 原始文件名（来自客户端机器）
     * @param contentType      内容类型（如果已知）
     * @param content          文件的内容
     */
    public MockMultipartFile(String name, String originalFilename, String contentType, byte[] content) {
        this.name = name;
        this.originalFilename = (originalFilename != null ? originalFilename : "");
        this.contentType = contentType;
        this.content = (content != null ? content : new byte[0]);
    }

    /**
     * 使用给定的内容流创建一个新的 MultipartFileDto。
     *
     * @param name             文件的名称
     * @param originalFilename 原始文件名（来自客户端机器）
     * @param contentType      内容类型（如果已知）
     * @param contentStream    文件内容流
     * @throws IOException 如果从流中读取失败
     */
    public MockMultipartFile(String name, String originalFilename, String contentType, InputStream contentStream)
            throws IOException {

        this(name, originalFilename, contentType, FileCopyUtils.copyToByteArray(contentStream));
    }

    // 2. 实现 MultipartFile 接口的方法

    @Override
    public String getName() {
        return this.name;
    }

    @Override
    public String getOriginalFilename() {
        return this.originalFilename;
    }

    @Override
    public String getContentType() {
        return this.contentType;
    }

    @Override
    public boolean isEmpty() {
        return (this.content.length == 0);
    }

    @Override
    public long getSize() {
        return this.content.length;
    }

    @Override
    public byte[] getBytes() throws IOException {
        return this.content;
    }

    @Override
    public InputStream getInputStream() throws IOException {
        return new ByteArrayInputStream(this.content);
    }

    @Override
    public void transferTo(File dest) throws IOException, IllegalStateException {
        FileCopyUtils.copy(this.content, dest);
    }
}